#include <signal.h>
#include <iostream>

//这是一个全局变量,正常情况下,接收到信号2
//信号被捕捉,执行自定义动作,hanlder中flag由0变为1
//下面的while循环条件为假,就会跳出循环
//原理如下:每当我们使用flag作为条件判断的时候,进程会每一次将内存中真实的flag值,放到cpu的寄存器中,然后cpu执行逻辑运算
//但是我们如果在g++编译的时候,加上-O1/-O2/-O3的选项(代表优化级别,数越大,优化越高)
//这个时候接收到信号2,信号被捕捉,执行自定义动作,flag由0变为1
//但是这个时候下面的while循环并不会跳出循环,这是为什么呢?
//因为当我们设置了优化级别的时候,编译器就会检查main函数中
//flag这个变量并没有进行修改,那么编译器这个时候
//就把flag放在了寄存器中,后面代码执行的时候
//不会将内存中真实的flag值放到cpu的寄存器中了
//将会一直使用这个falg值,提升了效率,也就是说
//这个flag值并不是内存中最新的flag值
//int flag = 0;

//当我们加上volatile的关键字的时候,将会保持内存的可见性,告诉编译器
//该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作,所以下面的while循环也就会跳出去了
volatile int flag = 0;

void hanlder(int signo)
{
    flag = 1;
    std::cout << "change flag 0 to 1!" << std::endl;
}

int main()
{
    signal(2, hanlder);
    while(!flag);
    std::cout << "进程正常退出" << std::endl;
    return 0;
}
